package com.newy.service.sys;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.newy.core.AppException;
import com.newy.core.BaseService;
import com.newy.core.util.LangUtils;
import com.newy.core.web.AppContext;
import com.newy.dao.sys.RoleDao;
import com.newy.dao.sys.RoleMenuDao;
import com.newy.dao.sys.RoleUserDao;
import com.newy.domain.sys.Menu;
import com.newy.domain.sys.Role;
import com.newy.domain.sys.RoleMenu;
import com.newy.domain.sys.RoleUser;
import com.newy.domain.sys.User;

/**
 * 角色管理服务类
 * @author linzongxue
 * @create_date 2012-1-7
 */
@Service
@Transactional
public class RoleService extends BaseService {
	@Resource private RoleDao roleDao;
	@Resource private RoleUserDao roleUserDao;
	@Resource private RoleMenuDao roleMenuDao;
	
	public void save(Role role){
		if (!roleDao.isPropsUnique(role, "name"))
			throw new AppException("保存角色失败：角色名称“%s”已存在", role.getName());
		if (role.getId() == null){
			role.setCreateUser(AppContext.getLoginUser().getId());
			role.setCreateTime(new Date());
		}
		
		roleDao.save(role);
	}

	/**
	 * 删除指定角色，同时删除与相关资源的关联
	 */
	public void delete(Long[] ids){
		for (Long id : ids){
			this.delete(id);
		}
	}
	
	/**
	 * 删除指定角色，同时删除与相关资源的关联
	 */
	public void delete(Long id){
		//清除角色与各种资源的关联
		roleUserDao.clearUsersFromRole(id);
		roleMenuDao.clearMenusFromRole(id);
		//删除角色
		roleDao.delete(id);
	}

	@Transactional(readOnly=true)
	public Role get(Long id){
		return roleDao.get(id);
	}

	/**
	 * 获取所有角色的列表，按名称拼音排序
	 */
	@Transactional(readOnly=true)
	public List<Role> list(){
		return roleDao.getAll();
	}

	@Transactional(readOnly=true)
	public List<User> getUsersOfRole(Long roleId){
		return roleUserDao.getUsersOfRole(roleId);
	}
	
	/**
	 * 将指定用户与指定的角色关联起来
	 * @param roleId 指定的角色id
	 * @param userIds 指定的用户id数组
	 */
	public void addUsersToRole(Long roleId, Long[] userIds){
		for(Long userId : userIds){
			RoleUser roleUser = new RoleUser();
			roleUser.setRoleId(roleId);
			roleUser.setUserId(userId);
			roleUserDao.save(roleUser);
		}
	}

	/**
	 * 将指定用户从指定的角色中移除
	 * @param roleId 指定的角色id
	 * @param userIds 指定的用户id数组
	 */
	public void removeUsersFromRole(Long roleId, Long[] userIds){
		if (LangUtils.isEmpty(userIds)) return;
		roleUserDao.removeUsersFromRole(roleId, userIds);
	}
	
	@Transactional(readOnly=true)
	public List<Menu> getMenusOfRole(Long roleId){
		return roleMenuDao.getMenusOfRole(roleId);
	}
	
	/**
	 * 将指定的菜单与指定的角色关联起来
	 * @param roleId 指定的角色id
	 * @param menuIds 指定的菜单id数组
	 */
	public void addMenusToRole(Long roleId, Long[] menuIds){
		for(Long menuId : menuIds){
			RoleMenu roleMenu = new RoleMenu();
			roleMenu.setRoleId(roleId);
			roleMenu.setMenuId(menuId);
			roleMenuDao.save(roleMenu);
		}
	}
	
	/**
	 * 将指定的菜单从指定的角色中移除
	 * @param roleId 指定的角色id
	 * @param menuIds 指定的菜单id数组
	 */
	public void removeMenusFromRole(Long roleId, Long[] menuIds){
		if (LangUtils.isEmpty(menuIds)) return;
		roleMenuDao.removeMenusFromRole(roleId, menuIds);
	}
}
